﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
using Data_Access_Layer;
using Business_Layer;
using log4net.Config;
using log4net;

namespace CaffeBillard
{
    public partial class FormSupplier : DevComponents.DotNetBar.Office2007Form
    {
        /// <summary>
        /// Khai báo lưu file Log 
        /// </summary>
        protected static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        public FormSupplier()
        {
            InitializeComponent();
            //Ẩn đi các cột không cần thiết của datagridview
            dgvSup.AutoGenerateColumns = false;
            this.BackColor = Color.FromArgb(194, 217, 247);
        }

        #region Khai báo
        /// <summary>
        /// Kiểm tra xem đã thêm, cập nhật xong chưa
        /// </summary>
        private bool _curr;

        /// <summary>
        /// Khai báo cho SupplierController
        /// </summary>
        private SuppilerController _manager;

        /// <summary>
        /// _selectall = true khi tất cả các dòng trong datagridview được check
        /// </summary>
        private bool _selectall = false;

        /// <summary>
        /// Khai báo in 
        /// </summary>
        private Utility _com;

        /// <summary>
        /// Tên nhân viên đăng nhập hiện tại
        /// </summary>
        private string name;
        #endregion

        #region Sự kiện form

        /// <summary>
        /// Hàm xử lý lấy danh sách tất cả nhà cung cấp
        /// </summary>
        private void LoadSup()
        {
            dgvSup.DataSource = new BindingSource { DataSource = _manager.GetAll() };
        }

        /// <summary>
        /// Xử lý Form Load
        /// </summary>
        private void SupplierForm_Load(object sender, EventArgs e)
        {
            name = Employee.Objects.FirstOrDefault(x => x.Id == WorkSession.Current.CurrentAccount.EmpId).Name.ToString();
            _manager = new SuppilerController();
            _com = new Utility();
            LoadSup();
        }

        /// <summary>
        /// Lúc nhấn phím enter hoặc chuyển qua dòng mới thì thêm mới hoặc update
        /// </summary>
        private void dgvSup_RowValidated(object sender, DataGridViewCellEventArgs e)
        {
            if(_curr)
            {
                try
                {
                    XmlConfigurator.Configure();
                    log.Info(name + ": Them nha cung cap");
                    //Lấy dòng hiện tại
                    var _cur = dgvSup.Rows[e.RowIndex];

                    //Tạo một đối tượng Supplier mới
                    Supplier sup= new Supplier();

                    //Gán các giá trị cho các thuộc tính tương ứng trên datagridview
                    sup.Id =Convert.ToInt32( _cur.Cells[1].Value.ToString());
                    sup.SupName = _cur.Cells[2].Value.ToString();
                    sup.Phone = _cur.Cells[3].Value.ToString();
                    sup.Address = _cur.Cells[4].Value.ToString();
                    sup.Deleted = false;
                    //Gọi phương thức thêm hoặc cập nhật từ lớp suppliermanager
                    _manager.InsertOrUpdate(sup);
                    //Nếu xảy ra lỗi thì thông báo lỗi
                    if(_manager._err!="")
                        MessageBox.Show(_manager._err, "Thông báo", MessageBoxButtons.OK,
                                    MessageBoxIcon.Warning);
                    LoadSup();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Lỗi hệ thống \n" + ex.Message, "Thông báo", MessageBoxButtons.OK,
                                     MessageBoxIcon.Warning);
                }
            }
            //Gán lại giá trị cho _curr
            _curr = false;
        }

        /// <summary>
        /// Kiểm tra dữ liệu nhập vào
        /// </summary>
        private void dgvSup_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {
            try
            {
                if (dgvSup.IsCurrentRowDirty && e.ColumnIndex > 0)
                {
                    var _curren = dgvSup.Rows[e.RowIndex];
                    if (_curren.Cells[2].Value == null || _curren.Cells[4].Value == null)
                    {
                        MessageBox.Show("Không được để trống dữ liệu!", "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Warning);
                        e.Cancel = true;
                    }
                    else if (!Phone(_curren.Cells[3].Value.ToString()))
                    {
                        MessageBox.Show("Số điện thoại không đúng định dạng!", "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Warning);
                        e.Cancel = true;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi hệ thống \n"+ex.Message, "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Warning);

            }
            _curr = dgvSup.IsCurrentRowDirty;
        }

        /// <summary>
        /// Tìm kiếm theo các kiểu đã chọn 
        /// </summary>
        private void txtFind_TextChanged(object sender, EventArgs e)
        {
            if (txtFind.Text == "")
                dgvSup.DataSource = new BindingSource {DataSource = _manager.GetAll()};
            switch(cbbFindType.Text)
            {
                case "Tìm theo mã":
                    int n = 0;
                    if (!int.TryParse(txtFind.Text, out n))
                        txtFind.Text = "";
                    else
                        dgvSup.DataSource = new BindingSource { DataSource = _manager.FindById(int.Parse(txtFind.Text)) };
                    break;
                case "Tìm theo tên":
                    dgvSup.DataSource = new BindingSource { DataSource = _manager.FindByName(txtFind.Text) };
                    break;
                case "TÌm theo SDT":
                    dgvSup.DataSource = new BindingSource { DataSource = _manager.FindByPhone(txtFind.Text) };
                    break;
                case "Tìm theo địa chỉ":
                    dgvSup.DataSource = new BindingSource { DataSource = _manager.FindByAdd(txtFind.Text) };
                    break;
                default:
                    dgvSup.DataSource = new BindingSource { DataSource = _manager.FindByName(txtFind.Text) };
                    break;
            }
        }

        /// <summary>
        /// Xử lý sự kiện khi bấm chọn dòng
        /// </summary>
        private void dgvSup_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex == -1)
            {
                if (e.ColumnIndex == 0)
                {
                    if (_selectall)
                    {
                        for (int i = 0; i < dgvSup.Rows.Count; i++)
                        {
                            dgvSup.Rows[i].Cells[0].Value = false;
                            _selectall = false;
                        }
                    }
                    else
                    {
                        for (int i = 0; i < dgvSup.Rows.Count; i++)
                        {
                            dgvSup.Rows[i].Cells[0].Value = true;
                            _selectall = true;
                        }
                    }
                }
            }
        }

        /// <summary>
        /// Xử lý sự kiện xóa Nhà cung cấp
        /// </summary>
        private void btnDelete_Click(object sender, EventArgs e)
        {
            //Lấy những dòng được chọn
            var selectedRows = dgvSup.Rows.Cast<DataGridViewRow>()
                    .Where(x => x.Cells[0].Value != null && x.Cells[1].Value != null && x.Cells[1].Value.ToString() != "0"  && (bool)x.Cells[0].Value)
                    .ToList();
            //Nếu không có dòng nào được chọn thì thông báo cho người dùng chọn lại
            if (selectedRows.Count == 0)
            {
                MessageBox.Show("Bạn chưa chọn nhà cung cấp nào để xóa", "Thông báo",
                                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            //Yêu cầu người dùng xác nhận việc xóa
            if (MessageBox.Show("Tất cả các nhà cung cấp sẽ được xóa bỏ, bạn có chắc muốn xóa không?", "Cảnh báo !!!", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                XmlConfigurator.Configure();
                log.Info(name + ": Xoa nha cung cap: ");
                //Duyệt qua từng dòng được chọn
                for (int i = selectedRows.Count - 1; i >= 0; i--)
                {   
                    // Lấy ra nhà cung cấp được chọn
                    var sup = selectedRows[i].DataBoundItem as Supplier;
                    //sup.Id = int.Parse(selectedRows[i].Cells[1].Value.ToString());
                    sup.Deleted = true;
                    _manager.Delete(sup);
                }
                //Load lại danh sách nhà cung cấp
                LoadSup();
            }
        }

        /// <summary>
        /// In danh sách nhà cung cấp
        /// </summary>
        private void btnPrint_Click(object sender, EventArgs e)
        {
            XmlConfigurator.Configure();
            log.Info(name + ": Xuat danh sach nha cung cap");
            CustomEx ex = new CustomEx();
            ex.Show();
            ex.FormClosed += ex_FormClosed;
        }

        /// <summary>
        /// Sự kiện đóng form In thì xuất ra file pfd hoặ excel
        /// </summary>
        private void ex_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (CustomEx.Hz.type == 2)
                ExportToPDF();
            else if (CustomEx.Hz.type == 1)
                ExportToEx();
        }

        /// <summary>
        /// Xuất ra file Excel
        /// </summary>
        private void ExportToEx()
        {

            saveFileDialog1.Filter = "(*.xls;*.xlsx)|*.xls;*.xlsx";
            saveFileDialog1.FileName = "*.xlsx";
            if (dgvSup.Rows.Count - 1 == 0)
                MessageBox.Show("Không có dữ liệu để xuất");
            else
                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                   _com.ExportToExcel(dgvSup,saveFileDialog1.FileName);
                }
        }

        /// <summary>
        /// Xuất ra file PDF
        /// </summary>
        private void ExportToPDF()
        {

            saveFileDialog1.Filter = "(*.PDF)|*.PDF";
            saveFileDialog1.FileName = "*.PDF";
            if (dgvSup.Rows.Count - 1 == 0)
                MessageBox.Show("Không có dữ liệu để xuất");
            else
                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    _com.ExportToPDF(dgvSup, saveFileDialog1.FileName);
                }
        }
        #endregion 

        #region Các hàm bổ trợ
        /// <summary>
        /// Hàm kiểm tra số điện thoại
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        public bool Phone(string s)
        {
            string pattern = @"0\d{9,10}";
            if (Regex.IsMatch(s, pattern))
                return true;
            else
            {
                return false;
            }
        }
        #endregion


        //Tìm kiếm tất cả
        private void cbbFindType_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbbFindType.Text == "Tất cả")
                dgvSup.DataSource = _manager.GetAll();
        }
    }
}
